package br.com.ecomanda.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.ecomanda.exceptions.ConexaoComBancoDeDadosException;
import br.com.ecomanda.model.OperacaoComanda;
import br.com.ecomanda.model.Pedido;
import br.com.ecomanda.model.StatusPedido;

public class PedidoDao extends GenericDao<Pedido> {
	
	public PedidoDao() throws ConexaoComBancoDeDadosException {
		super();
		// TODO Auto-generated constructor stub
	}
	
	@SuppressWarnings("unchecked")
	public List<Pedido> getPedidos(OperacaoComanda operacaoComanda){
		Criteria criteria = createCriteria();
		
		if(operacaoComanda != null)
			criteria.add( Restrictions.eq("operacaoComanda", operacaoComanda) );
		
		List<Pedido> pedidos = criteria.list();
		
		if (pedidos == null)
			return null;
		else if (pedidos.size() == 0)
			return null;
		
		return pedidos;
	}

	@SuppressWarnings("unchecked")
	public List<Pedido> getPedidos(OperacaoComanda operacaoComanda, List<StatusPedido> status){
		Criteria criteria = createCriteria();
		
		if(operacaoComanda != null)
			criteria.add( Restrictions.eq("operacaoComanda", operacaoComanda) );
		
		if(status != null)
			criteria.add( Restrictions.in("statusPedido", status) );
		
		List<Pedido> pedidos = criteria.list();
		
		if (pedidos == null)
			return null;
		else if (pedidos.size() == 0)
			return null;
		
		return pedidos;
	}

	@SuppressWarnings("unchecked")
	public List<Pedido> getPedidos(OperacaoComanda operacaoComanda,
			StatusPedido status) {
		Criteria criteria = createCriteria();
		
		if(operacaoComanda != null)
			criteria.add( Restrictions.eq("operacaoComanda", operacaoComanda) );
		
		if(status != null)
			criteria.add( Restrictions.eq("statusPedido", status) );
		
		List<Pedido> pedidos = criteria.list();
		
		if (pedidos == null)
			return null;
		else if (pedidos.size() == 0)
			return null;
		
		return pedidos;
	}

	public Pedido getUltimoPedido(OperacaoComanda operacaoComanda) {
		Criteria criteria = createCriteria();
		
		if(operacaoComanda != null)
			criteria.add( Restrictions.eq("operacaoComanda", operacaoComanda) );
		
		criteria.addOrder( Order.desc( "dtPedido" ) );
		criteria.setMaxResults(1);
		
		return (Pedido) criteria.uniqueResult();
	}

}
